
package model;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import bean.*;

import rmi.ModeloCasaCentralRemoto;

import VOs.*;
import dao.*;

public class ModeloCasaCentral extends UnicastRemoteObject implements ModeloCasaCentralRemoto{
	private static final long serialVersionUID = 8995341251855648280L;
	private EntityManagerFactory emf;
	private EntityManager em;
	
	public ModeloCasaCentral()throws RemoteException {
		super();
		//emf = Persistence.createEntityManagerFactory("TPCorreo");
	}
	
	public void procesarMensaje (String msj) throws RemoteException {
		System.out.println("Mensaje procesado: " + msj);
	}

	public UsuarioVO guardarUsuario(UsuarioVO usrVO){
		em = emf.createEntityManager();		
		
		em.getTransaction().begin();
		
		UsuarioDAO usrDAO = UsuarioDAO.getInstancia();
		usrDAO.init(em);
		
		Usuario usuario = usrDAO.findByName(usrVO.getNombre());
		if(usuario == null){
			usuario = usrDAO.create(usrVO.getNombre(), usrVO.getPassword());
			
		}else{
			usuario = usrDAO.update(usuario.getUsuarioId(), usrVO.getNombre(), usrVO.getPassword());
		}
		em.getTransaction().commit();
		
		em.close();
		emf.close();
		
		usrVO.setUsuarioId(usuario.getUsuarioId());
		usrVO.setNombre(usuario.getNombre());
		usrVO.setPassword(usuario.getPassword());
				
		return usrVO;
	}
	
//	public void eliminarUsuario(UsuarioVO usr){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		UsuarioDAO usrDAO = UsuarioDAO.getInstancia();
//		usrDAO.init(em);
//		
//		usrDAO.remove(usr.getUsuarioId());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();				
//	}
//	
//	public Vector<UsuarioVO> getUsuarios()throws RemoteException{
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
////		System.out.println("Step 0.1");
//		UsuarioDAO usrDAO = UsuarioDAO.getInstancia();
////		System.out.println("Step 0.2");
//		usrDAO.init(em);
////		System.out.println("Step 0.3");
//		
//		ArrayList<Usuario> usuarios = (ArrayList<Usuario>) UsuarioDAO.getInstancia().findAll();
////		System.out.println("Step 0.4");
//		Vector<UsuarioVO> usuariosVO = new Vector<UsuarioVO>();
////		System.out.println("Step 0.5");
//		if(usuarios != null){
////			System.out.println("Step 0.6");
//			for(Usuario u : usuarios){
//				UsuarioVO usrVO = new UsuarioVO();
//				usrVO.setUsuarioId(u.getUsuarioId());
//				usrVO.setNombre(u.getNombre());
//				usrVO.setPassword(u.getPassword());
////				System.out.println("Step 1");
////				CasillaDAO casDAO = CasillaDAO.getInstancia();
////				casDAO.init(em);
////				List<Casilla> casillasAux = casDAO.findByUser(u);
//////				System.out.println("Step 2");
////				if(casillasAux != null){
//////					System.out.println("Step 3");
////					for(Casilla c : casillasAux){
//////						System.out.println("Step 4");
////						CasillaVO casillaVO = new CasillaVO();
////						casillaVO.setId(c.getCasillaId());
////						casillaVO.setNombre(c.getNombre());
////						Vector<CasillaVO> casillasVO = (Vector<CasillaVO>) usrVO.getCasillas();
////						if(casillasVO != null){
//////							System.out.println("Step 5");
////							casillasVO.add(casillaVO);
////						}
////					}
////				}			
////				System.out.println("Step 6");
//				usuariosVO.add(usrVO);
////				System.out.println("Step 7");
//			}
//		}
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		return usuariosVO;
//	}
//	
//	public void agregarCasillaUsuario(UsuarioVO usr, CasillaVO cas){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		UsuarioDAO usrDAO = UsuarioDAO.getInstancia();
//		usrDAO.init(em);
//		
//		usrDAO.addUsuarioCasilla(usr.getUsuarioId(), cas.getId());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//	}
//	
//	public Vector<CasillaVO> getCasillasUsuario(UsuarioVO usrVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		Usuario usr = em.find(Usuario.class, usrVO.getUsuarioId());
//		CasillaDAO casillaDAO = CasillaDAO.getInstancia();
//		casillaDAO.init(em);
//			
//		List<Casilla> casillas = casillaDAO.findByUser(usr);
//		Vector<CasillaVO> casillasVO = new Vector<CasillaVO>();
//		for(Casilla c : casillas){
//			casillasVO.add(new CasillaVO(c.getCasillaId(), c.getNombre()));
//		}
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		
//		return casillasVO;
//	}
//	
//	//Metodo web
//	public Vector<CasillaVO> getCasillasUsuario(String nombreUsr){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		UsuarioDAO usrDAO = UsuarioDAO.getInstancia();
//		usrDAO.init(em);
//		
//		Usuario usr = usrDAO.findByName(nombreUsr);
//		
//		System.out.println("usr="+usr.getNombre());
//		
//		CasillaDAO casillaDAO = CasillaDAO.getInstancia();
//		casillaDAO.init(em);
//		
//		List<Casilla> casillas = casillaDAO.findByUser(usr);
//		
//		
//		Vector<CasillaVO> casillasVO = new Vector<CasillaVO>();
//		for(Casilla c : casillas){
//			casillasVO.add(new CasillaVO(c.getCasillaId(), c.getNombre()));
//		}
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		
//		return casillasVO;
//	}
//	
//	public Vector<CasillaVO> getCasillasDisponiles(){
//		em = emf.createEntityManager();		
//		em.getTransaction().begin();
//		
//		CasillaDAO casillaDAO = CasillaDAO.getInstancia();
//		casillaDAO.init(em);
//			
//		List<Casilla> casillas = casillaDAO.findAvailable();
//		Vector<CasillaVO> casillasVO = new Vector<CasillaVO>();
//		for(Casilla c : casillas){
//			casillasVO.add(new CasillaVO(c.getCasillaId(), c.getNombre()));
//		}
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		
//		return casillasVO;
//	}
//	
//	public void eliminarCasillaUsuario(UsuarioVO usr, CasillaVO cas){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		UsuarioDAO usrDAO = UsuarioDAO.getInstancia();
//		usrDAO.init(em);
//		
//		usrDAO.removeUsuarioCasilla(usr.getUsuarioId(), cas.getId());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//	}
//	
//	public CasillaVO crearCasilla(CasillaVO casillaVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		CasillaDAO casDAO = CasillaDAO.getInstancia();
//		casDAO.init(em);
//		
//		Casilla casilla = casDAO.create(casillaVO.getNombre());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();	
//		
//		casillaVO.setId(casilla.getCasillaId());
//		casillaVO.setNombre(casilla.getNombre());
//		
//		return casillaVO;
//	}
//	
//	public void eliminarCasilla(CasillaVO casillaVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		CasillaDAO casDAO = CasillaDAO.getInstancia();
//		casDAO.init(em);
//		
//		casDAO.remove(casillaVO.getId());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();				
//	}
//	
//	public Vector<CasillaVO> getCasillas(){
//		em = emf.createEntityManager();
//		CasillaDAO casDAO = CasillaDAO.getInstancia();
//		casDAO.init(em);
//		
//		ArrayList<Casilla> casillas = (ArrayList<Casilla>) CasillaDAO.getInstancia().findAll();
//		Vector<CasillaVO> casillasVO = new Vector<CasillaVO>(); 
//		for(Casilla c : casillas){
//			CasillaVO casAux = new CasillaVO();
//			casAux.setId(c.getCasillaId());
//			casAux.setNombre(c.getNombre());			
//			casillasVO.add(casAux);
//		}
//		return casillasVO;
//	}
//	
//	public OficinaVO crearOficina(OficinaVO ofiVO){
//		EntityManager em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		OficinaDAO ofiDAO = OficinaDAO.getInstancia();
//		ofiDAO.init(em);
//		
//		Oficina oficina = ofiDAO.create(ofiVO.getNombre());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		
//		ofiVO.setOficinaId(oficina.getOficinaId());
//		ofiVO.setNombre(oficina.getNombre());
//		
//		return ofiVO;
//	}
//	
//	public void eliminarOficina(OficinaVO ofiVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		OficinaDAO ofiDAO = OficinaDAO.getInstancia();
//		ofiDAO.init(em);
//		
//		ofiDAO.remove(ofiVO.getOficinaId());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();				
//	}
//	
//	public void agregarCasillaOficina(OficinaVO ofiVO, CasillaVO casVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		OficinaDAO ofiDAO = OficinaDAO.getInstancia();
//		ofiDAO.init(em);
//		
//		ofiDAO.addOficinaCasilla(ofiVO.getOficinaId(), casVO.getId());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//	}
//	
//	public void eliminarCasillaOficina(OficinaVO ofiVO, CasillaVO casVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		OficinaDAO ofiDAO = OficinaDAO.getInstancia();
//		ofiDAO.init(em);
//		
//		ofiDAO.removeOficinaCasilla(ofiVO.getOficinaId(), casVO.getId());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//	}
//		
//	public Vector<OficinaVO> getOficinas()throws RemoteException{
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//
//		OficinaDAO ofDAO = OficinaDAO.getInstancia();
//		ofDAO.init(em);
//		
//		ArrayList<Oficina> oficinas = (ArrayList<Oficina>) ofDAO.findAll();
//		Vector<OficinaVO> oficinasVO = new Vector<OficinaVO>();
//		if(oficinas != null){
//			for(Oficina of : oficinas){
//				OficinaVO ofVO = new OficinaVO();
//				ofVO.setOficinaId(of.getOficinaId());
//				ofVO.setNombre(of.getNombre());
//				
//				oficinasVO.add(ofVO);
//			}
//		}
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		return oficinasVO;
//	}
//	
//	public Vector<CasillaVO> getCasillasOficina(OficinaVO ofVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		Oficina of = em.find(Oficina.class, ofVO.getOficinaId());
//		CasillaDAO casillaDAO = CasillaDAO.getInstancia();
//		casillaDAO.init(em);
//			
//		List<Casilla> casillas = casillaDAO.findByOffice(of);
//		Vector<CasillaVO> casillasVO = new Vector<CasillaVO>();
//		for(Casilla c : casillas){
//			casillasVO.add(new CasillaVO(c.getCasillaId(), c.getNombre()));
//		}
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		
//		return casillasVO;
//	}
//	
//	public Vector<OficinaVO> getOficinasAmigas(OficinaVO ofVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
////		Oficina of = em.find(Oficina.class, ofVO.getOficinaId());
//		OficinaDAO ofDAO = OficinaDAO.getInstancia();
//		ofDAO.init(em);
//			
//		List<Oficina> oficinasAmigas = ofDAO.findAmigas(ofVO.getOficinaId());
//		Vector<OficinaVO> oficinasVO = new Vector<OficinaVO>();
//		for(Oficina o : oficinasAmigas){
//			oficinasVO.add(new OficinaVO(o.getOficinaId(), o.getNombre()));
//		}
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		
//		return oficinasVO;
//	}
//	
//	public void agregarOficinaAmiga(OficinaVO ofiVO, OficinaVO ofiAmigaVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		OficinaDAO ofiDAO = OficinaDAO.getInstancia();
//		ofiDAO.init(em);
//		
//		ofiDAO.addOficinaAmiga(ofiVO.getOficinaId(), ofiAmigaVO.getOficinaId());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//	}
//	
//	public void eliminarOficinaAmiga(OficinaVO ofiVO, OficinaVO ofiAmigaVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		OficinaDAO ofiDAO = OficinaDAO.getInstancia();
//		ofiDAO.init(em);
//		
//		ofiDAO.removeOficinaAmiga(ofiVO.getOficinaId(), ofiAmigaVO.getOficinaId());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//	}
//	
//	//Metodos para el servidor web
//	public boolean verificarUsuario(String nombre, String pass){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		UsuarioDAO usrDAO = UsuarioDAO.getInstancia();
//		usrDAO.init(em);
//		
//		Usuario usuario = usrDAO.findByName(nombre);
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		
//		if(usuario != null){
//			if(usuario.getNombre().equals(nombre) && usuario.getPassword().equals(pass))
//				return true;
//		}
//		return false;
//	}
//	
//	public Vector<MensajeVO> getMensajesCasilla(String nombreCasilla){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		CasillaDAO casillaDAO = CasillaDAO.getInstancia();
//		casillaDAO.init(em);
//		
//		Casilla casilla = casillaDAO.findByName(nombreCasilla);
//			
//		List<Mensaje> mensajes = casillaDAO.findMensajes(casilla.getCasillaId());
//		Vector<MensajeVO> mensajesVO = new Vector<MensajeVO>();
//		for(Mensaje m : mensajes){
//			mensajesVO.add(new MensajeVO(m.getId(), 
//										m.getClasificacion(), 
//										m.getAsunto(), 
//										m.getTexto(), 
//										m.getFecha(), 
//										m.getEstado()));
//		}
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		
//		return mensajesVO;
//	}
//	
//	public Vector<MensajeVO> getMensajesGuardadosCasilla(String nombreCasilla){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		CasillaDAO casillaDAO = CasillaDAO.getInstancia();
//		casillaDAO.init(em);
//		
//		Casilla casilla = casillaDAO.findByName(nombreCasilla);
//			
//		List<Mensaje> mensajes = casillaDAO.findMensajes(casilla.getCasillaId());
//		Vector<MensajeVO> mensajesVO = new Vector<MensajeVO>();
//		for(Mensaje m : mensajes){
//			if(m.getEstado().equals(Mensaje.ESTADO_BORRADOR)){
//				mensajesVO.add(new MensajeVO(m.getId(), 
//											m.getClasificacion(), 
//											m.getAsunto(), 
//											m.getTexto(), 
//											m.getFecha(), 
//											m.getEstado()));
//			}
//		}
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		
//		return mensajesVO;
//	}
//	
//	public Vector<MensajeVO> getMensajesEnviadosCasilla(String nombreCasilla){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		CasillaDAO casillaDAO = CasillaDAO.getInstancia();
//		casillaDAO.init(em);
//		
//		Casilla casilla = casillaDAO.findByName(nombreCasilla);
//			
//		List<Mensaje> mensajes = casillaDAO.findMensajes(casilla.getCasillaId());
//		Vector<MensajeVO> mensajesVO = new Vector<MensajeVO>();
//		for(Mensaje m : mensajes){
//			if(m.getEstado().equals(Mensaje.ESTADO_ENVIADO)){
//				mensajesVO.add(new MensajeVO(m.getId(), 
//											m.getClasificacion(), 
//											m.getAsunto(), 
//											m.getTexto(), 
//											m.getFecha(), 
//											m.getEstado()));
//			}
//		}
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		
//		return mensajesVO;
//	}
//	
//	public Vector<MensajeVO> getMensajesBorradosCasilla(String nombreCasilla){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		CasillaDAO casillaDAO = CasillaDAO.getInstancia();
//		casillaDAO.init(em);
//		
//		Casilla casilla = casillaDAO.findByName(nombreCasilla);
//			
//		List<Mensaje> mensajes = casillaDAO.findMensajes(casilla.getCasillaId());
//		Vector<MensajeVO> mensajesVO = new Vector<MensajeVO>();
//		for(Mensaje m : mensajes){
//			if(m.getEstado().equals(Mensaje.ESTADO_ELIMINADO)){
//				mensajesVO.add(new MensajeVO(m.getId(), 
//											m.getClasificacion(), 
//											m.getAsunto(), 
//											m.getTexto(), 
//											m.getFecha(), 
//											m.getEstado()));
//			}
//		}
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//		
//		return mensajesVO;
//	}
//	
//	public void agregarMensajeCasilla(CasillaVO casOrigenVO, CasillaVO casDestVO, MensajeVO msjVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		CasillaDAO casillaDAO = CasillaDAO.getInstancia();
//		casillaDAO.init(em);
//		
//		Mensaje mensaje = new Mensaje(msjVO);
//		mensaje.setEstado(Mensaje.ESTADO_BORRADOR);
//		em.persist(mensaje);
//		
//		casillaDAO.addCasillaMesaje(casOrigenVO.getId(), msjVO.getId(), casDestVO.getId());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//	}
//	
//	public void enviarMensajeCasilla(CasillaVO casOrigenVO, CasillaVO casDestVO, MensajeVO msjVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		Mensaje mensaje = em.find(Mensaje.class, msjVO.getId());
//		
//		mensaje.setEstado(Mensaje.ESTADO_ENVIADO);
//		
//		em.persist(mensaje);
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//	}
//	
//	public void borrarMensajeCasilla(CasillaVO casOrigenVO, CasillaVO casDestVO, MensajeVO msjVO ){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		Mensaje mensaje = em.find(Mensaje.class, msjVO.getId());
//		
//		mensaje.setEstado(Mensaje.ESTADO_ELIMINADO);
//		
//		em.persist(mensaje);
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//	}
//	
//	public void eliminarMensajeCasilla(CasillaVO casOrigenVO, MensajeVO msjVO){
//		em = emf.createEntityManager();
//		
//		em.getTransaction().begin();
//		
//		CasillaDAO casillaDAO = CasillaDAO.getInstancia();
//		casillaDAO.init(em);
//		
//		casillaDAO.rmvCasillaMesaje(casOrigenVO.getId(), msjVO.getId());
//		
//		em.getTransaction().commit();
//		
//		em.close();
//		emf.close();
//	}
}
